# -*- coding: utf-8 -*-
"""
@Time ： 2025/5/23 15:05
@Auth ： 九问
@File ：yaml_check_utils.py
@IDE ：PyCharm
@Email : 2750826557@qq.com
"""
from dataclasses import dataclass
from typing import Optional, Union, Dict, List, Any


@dataclass
class Case:
    """测试用例数据结构"""
    # 必填字段
    title: str
    request: dict
    
    # 可选字段（直接指定默认值）
    feature: str = '默认功能'
    story: str = '默认故事'
    validate: Union[Dict[str, Any], List[Dict[str, List]], None] = None
    extract: Optional[dict[str, str]] = None


def check_yaml(case: dict) -> Case:
    """
    校验YAML测试用例结构，支持多种格式
    
    :param case: 原始用例字典
    :return: Case对象
    :raises ValueError: 当必填字段缺失时抛出
    """
    try:
        # 必填字段
        if 'title' not in case:
            raise KeyError('title')
        if 'request' not in case:
            raise KeyError('request')
        
        # 创建Case对象
        return Case(
            title=case['title'],
            request=case['request'],
            feature=case.get('feature', '默认功能'),
            story=case.get('story', '默认故事'),
            validate=case.get('validate'),
            extract=case.get('extract')
        )
    except KeyError as e:
        raise ValueError(f"缺少必填字段: {e}") from e


if __name__ == '__main__':
    # 测试用例1：基本格式
    test_case1 = {
        'title': '登录测试',
        'request': {'method': 'POST', 'url': '/api/login'},
    }
    validated1 = check_yaml(test_case1)
    print(validated1)  # Case(title='登录测试', request={...}, feature='默认功能', story='默认故事', validate=None, extract=None)
    
    # 测试用例2：完整格式
    test_case2 = {
        'feature': 'Auth Module',
        'story': 'Login',
        'title': '登录成功测试',
        'request': {'method': 'POST', 'url': '/api/login', 'json': {'username': 'test', 'password': '123456'}},
        'validate': {'code': 0, 'message': 'success', '$.data.token': 'Bearer '},
        'extract': {'token': '$.data.token'}
    }
    validated2 = check_yaml(test_case2)
    print(validated2)
    
    # 测试用例3：列表断言格式
    test_case3 = {
        'title': '注册成功测试',
        'request': {'method': 'POST', 'url': '/api/register'},
        'validate': [
            {'eq': ['code', 0]},
            {'contains': ['message', '成功']}
        ]
    }
    validated3 = check_yaml(test_case3)
    print(validated3)
